CrackMe 1 by WiteG by Kwasek

Witam wszystkich crackerw, a w szczeglnoci tych ktrzy czsto odwiedzaj stron www.crackmes.prv.pl lub inna stron z tymi bardzo interesujcymi programikami. Bardzo dawno temu zamaem CrackMe 1 by WiteG, zamaem go technika brute-force, poniewa szukany kluczyk mia dugo 32 bitw. Poprawny kluczyk otrzymaem po kilku godzinach, co umoliwio mi zrobienie keygena. Wszystko piknie adnie, ale mimo, e keygen generowa poprawne dane autor nie uzna tego rozwizania i susznie poniewa w doczonym do cm pliku readme autor wyranie napisa ze: "Brute-force take nie jest tu waciwa droga." Moemy sie rwnie dowiedzie, e "procka generujca jest cakowicie odwracalna". Mino sporo czasu gdy przystpiem do analizowania kodu cm w celu obrcenia w jaki sposb caej procedury. Przedstawi tu w jaki sposb jest sprawdzany serial i w jaki sposb go wyliczy. Name musi mi minimum 4 znaki, Serial musi skada sie z 8 znakw,

Obliczany jest taki hash z Name:

_zlicz:
      add  cx, [eax+esi-1]
      add  bx, cx
      rol  ebx, 7
      ror  ecx, 7
      xor  ebx, ecx
      ror  ebx, 3
      dec  eax
      jnz  _zlicz       ; ebx - ciekawa liczba z name ;)
      shr  ebx, 1

Serial musi znajdowa sie z zakresu '123456789ABCDEF' zamieniany jest na hexdword, ktry znajduje sie w edx, a nastpnie troch zamieszany

      ror   edx, 4   ; edx -odwzorowany nasz serial ale wspak
      bswap edx      ; mae zamieszanie (zmiana bajtw)
      xor   ebx, edx ; xorowanie z nasza liczba z name, wnioskuje
                     ; ze ta liczba jest staa

Czyli w EBX mamy warto zalena od name i seriala

      movq  mm0, qword_01            ;\
      movq  mm1, qword_02            ; \
      movq  mm2, qword_03            ;  \
      movq  mm3, qword_04            ;   \    przepisanie qword'w do
      movq  qword_a, mm0             ;   /    innego obszaru pamieci
      movq  qword_b, mm1             ;  /
      movq  qword_c, mm2             ; /
      movq  qword_d, mm3             ;/

Ta procka po prostu kopiuje 32 bajty w inne miejsce

      mov  ecx, 8

_wypelnij:
      xor  dword ptr [qword_a + ecx*4 - 4], ebx
      dec  ecx
      jnz  _wypelnij                     ; xoruje ebx'em kawaek                                           				 ; pamieci

Tutaj nasza magiczna warto (name&serial) xoruje nasze skopiowane 32 bajty. Tu ju mog powiedzie ze wszystko zaley od tej 32 bitowej wartoci, bardzo atwo mona zrobi Brute-force'a ale jak wiadomo jest to zabronione, tak wic przyjrzyjmy sie co dalej robi cm:

      push  100h
      push  offset aTryToCrackThis  ;Try to crack this little crackme.
      call  _Proc_01
      push  100h
      push  offset _alloc           ;tu bdzie wynik
      push  offset qword_a          ;nasze zxoworowane 32 bajty
      call  _Proc_02

Lepiej nie wchod w te calle bo dostaniesz wira. Po prostu jest tam MEGA SIEKA NA MMXACH.

      mov  esi, offset _alloc
      mov  ecx, 8

_xorowanie:
      mov  eax, dword ptr [_last_equ+ecx*4-4] ; xoruje tylko z tym cigiem
      xor  dword ptr [_alloc + ecx*4 - 4], eax;       
      jnz  _bad_Boy

      dec  ecx
      jnz  _xorowanie

A tu jest ostateczne sprawdzanie

_alloc musi by rwne _last_equ

_last_equ  db 60h, 2Dh, 0Dh, 0D9h, 38h, 0, 16h, 0DAh, 72h, 0C2h, 0E0h
       db 0C1h, 0E6h, 0A6h, 6Bh, 81h, 0ABh, 2 dup(67h), 0EBh
       db 0AAh, 0FFh, 87h, 0E8h, 23h, 0C5h, 58h, 5Eh, 98h, 0DDh, 26h,0E8h

No dobra teraz trzeba tylko to obrci, ale patrzc na to co si dzieje w tych callach to sie wszystkiego odechciewa. Patrzc na inne Crackmesy WiteG'a mona wywnioskowa, e bardzo czsto uywa on jaki oglnie dostpnych algorytmw szyfrowania. A wic poszukaem tam i tu w necie i znalazem algorytm w ktrym jest ta sama mega sieka na mmxach. Algorytm ten nazywa sie Serpent. Zobaczmy jak wyglda szyfrowanie:

      push  len
      push  offset key
      call  _serpent_set_key

      push  offset outblk
      push  offset enc
      call  _serpent_encrypt


      push 100h
      push offset aTryToCrackThis   ;Try to crack this little crackme.
      call _serpent_set_key

      push offset _alloc            ;tu bdzie wynik
      push offset qword_a           ;nasze zxoworowane 32 bajty
      call _serpent_encrypt

Teraz w prosty sposb mona zdeszyfrowac 32 bajty (_last_equ)

      push len
      push offset key
      call _serpent_set_key
      push offset outblk
      push offset decipher
      call _serpent_decrypt

czyli:

      push 100h
      push offset aTryToCrackThis ;Try to crack this little crackme.
      call _serpent_set_key

      push offset wynik
      push offset _last_equ
      call _serpent_decrypt

Gdy wykonasz powyszy kod, bdziesz musia zxorowa pierwszy dword wyniku z pierwszym dwordem qword_a. W wyniku tego otrzymasz magiczny kluczyk ktry pozwoli ci napisa keygena.

A KLUCZYK MA POSTA: 734386D8h

       mov  eax, dword wynik
       xor  dword [eax], 7B2D53EAh ; 7B2D53EAh - 1 dword z qword_a

Jeli jeszcze czego nie zrozumiae poogldaj sobie source decrypt.exe i keygena. Patrzc na inne crackmesy WiteG'a nasuwa mi sie pytanie czy jest sens robienie takich crackmesw, ktre maja z 5(nie swoich) znanych lub mniej znanych algorytmw szyfrowania. Ot wydaje mi si e tak, poniewa moemy coraz czciej spotka takie algosy w ronych programach. Jak ju napisaem 'wydaje mi si' dlatego poniewa wedug mnie wszystko uzalenione jest od crackera ktry rozwiza dane crackme. Rozwizanie to powinno by w formie tutoriala, ewentualnie source keygena wraz z komentarzami. Zdarzaj si czsto rozwizania do tego typu crackme w formie keygena bez rda o tutorialu nie wspominajc, albo z krtkim opisem jak przebiega szyfrowanie i deszyfrowanie, ktry w minimalnym stopniu rekompensuje brak tekstu z opisem jego zamania. Wtedy inny cracker dostajc takie biedne rozwizanie do cm, bdzie mia zero poytku, nic nie zrozumie, nic si nie nauczy. A chyba o nauk w tym wszystkim chodzi. Wyjtkiem moe by opisanie jakiego oklepanego algo szyfrujcego, po co opisywa skoro ju by kilka razy opisany, no chyba ze algo jest lekko zmodyfikowany.